package function

//go:nosplit
func Swap(a, b int) (int, int)

func Foo(a bool, b int16) (c []byte)

func Foo2() {
	//var c []byte
	//var b int16
	//var a bool
}

// 用诡代思路将全部的参数和返回值以同样的顺序分别放到两个结构体中
//type Foo_args struct {
//	a bool
//	b int16
//	c []byte
//}
//
//type Foo_returns struct {
//	c []byte
//}

// 大致计算思路
//func Foo(FP *SomeFunc_args, FP_ret *SomeFunc_returns) {
//	// a = FP + offsetof(&args.a)
//	_ = unsafe.Offsetof(FP.a) + uintptr(FP) // a
//	// b = FP + offsetof(&args.b)
//
//	// argsize = sizeof(args)
//	argsize = unsafe.Offsetof(FP)
//
//	// c = FP + argsize + offsetof(&return.c)
//	_ = uintptr(FP) + argsize + unsafe.Offsetof(FP_ret.c)
//
//	// framesize = sizeof(args) + sizeof(returns)
//	_ = unsafe.Offsetof(FP) + unsafe.Offsetof(FP_ret)
//
//	return
//}

func printSum(a, b int) {
	var ret = Sum(a, b)
	println(ret)
}

func Sum(a, b int) int {
	return a + b
}
